﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ZackFlame.IronBrainFuck.Parser
{
    /// <summary>
    /// Описывает одну или несколько одинаковых команд в BrainFuck программе.
    /// </summary>
    public struct BrainAction
    {
        /// <summary>
        /// Тип команды в BrainFuck программе.
        /// </summary>
        public BrainOperation Operation;

        /// <summary>
        /// Количество одинаковых команд.
        /// </summary>
        public uint Count;

        /// <summary>
        /// Инициализирует команду с полем Count = 1.
        /// </summary>
        /// <param name="operation">Тип команды в BrainFuck программе.</param>
        public BrainAction(BrainOperation operation)
            : this(operation, 1)
        {
        }

        /// <summary>
        /// Инициализирует команду с заданным количеством в поле Count.
        /// При value большим, чем 1, значение operation должно быть равным
        /// BrainOperation.(Add|Sub|Right|Left|Zero).
        /// </summary>
        /// <param name="operation">Тип команд в BrainFuck программе.</param>
        /// <param name="value">
        /// Количество последовательно следующих друг за другом команд в программе.
        /// </param>
        public BrainAction(BrainOperation operation, uint value)
        {
            if (value > 1 && BrainParser.SingleOperations.Contains(operation))
            {
                throw new ArgumentException(
                    string.Format(
                        "При operation == {0} значение {1} недопустимо для value.",
                        typeof(BrainOperation).Name + "." + operation.ToString(),
                        value),
                    "value");
            }

            Operation = operation;
            Count = value;
        }
    }
}
